package com.kds.smarthome.mapper;

import com.kds.smarthome.entity.Function;
import com.kds.smarthome.entity.HvacMonitorCfg;
import com.kds.smarthome.entity.IndoorEnvironmentCfg;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 功能点 Mapper 接口
 */
@Mapper
public interface FunctionMapper {
    List<String> findFidsByBuildingCodeAndTypes(
            @Param("buildingCode") String buildingCode,
            @Param("name") String name,
            @Param("energyType") String energyType,
            @Param("statisticsType") String statisticsType
    );

    List<Map<String, String>> findNameAndFidsByBuildingCodeAndTypes(
            @Param("buildingCode") String buildingCode,
            @Param("name") String name,
            @Param("energyType") String energyType,
            @Param("statisticsType") String statisticsType
    );

    /**
     * 查询能耗累计类型的设备FID列表
     *
     * @param buildingCode 建筑编码，可为空
     * @return FID列表
     */
    List<String> energyFids(@Param("buildingCode") String buildingCode);

    /**
     * 查询能耗功能点列表
     *
     * @param buildingCode 建筑编码（可选）
     * @return 功能点列表
     */
    List<Function> selectEnergyFunctions(@Param("buildingCode") String buildingCode);

    /**
     * 查询室内环境指标
     *
     * @param buildingCode 建筑编码
     * @param indicators   指标类型数组
     * @return 功能点列表
     */
    List<Function> selectIndoorEnvironmentIndicators(@Param("buildingCode") String buildingCode, @Param("indicators") String[] indicators);

    /**
     * 根据建筑编码查询HVAC监控配置
     *
     * @param buildingCode 建筑编码
     * @return HVAC监控配置
     */
    HvacMonitorCfg selectHvacMonitorCfg(@Param("buildingCode") String buildingCode);

    /**
     * 根据建筑编码查询室内环境数据
     *
     * @param buildingCode 建筑编码
     * @return 室内环境数据
     */
    IndoorEnvironmentCfg selectBuildingIndoorEnvironmentFids(@Param("buildingCode") String buildingCode);

    /**
     * 根据ID查询功能点
     */
    Function findById(@Param("tid") Integer tid);

    /**
     * 根据FID查询功能点
     */
    Function findByFid(@Param("fid") String fid);

    /**
     * 查询所有功能点
     */
    List<Function> findAll();

    /**
     * 根据建筑编码查询功能点列表
     */
    List<Function> findByBuildingCode(@Param("buildingCode") String buildingCode);

    /**
     * 新增功能点
     */
    void insert(Function function);

    /**
     * 更新功能点
     */
    void update(Function function);

    /**
     * 删除功能点
     */
    void delete(@Param("tid") Integer tid);

    /**
     * 批量删除功能点
     */
    void batchDelete(@Param("tids") List<Integer> tids);

    /**
     * 根据条件查询功能点列表
     */
    List<Function> findByCondition(Function function);

    /**
     * 统计功能点数量
     */
    long count(Function function);

    /**
     * 分页查询功能点列表
     * @param function 查询条件
     * @param offset 起始位置
     * @param limit 每页记录数
     * @return 功能点列表
     */
    List<Function> findByPage(
            @Param("function") Function function,
            @Param("offset") int offset,
            @Param("limit") int limit
    );

    /**
     * 分页查询功能点列表（带排序）
     * @param function 查询条件
     * @param offset 起始位置
     * @param limit 每页记录数
     * @param sortField 排序字段
     * @param sortOrder 排序方式（asc/desc）
     * @return 功能点列表
     */
    List<Function> findByPageWithSort(
            @Param("function") Function function,
            @Param("offset") int offset,
            @Param("limit") int limit,
            @Param("sortField") String sortField,
            @Param("sortOrder") String sortOrder
    );

    /**
     * 根据FID列表查询功能点
     * @param fids FID列表
     * @return 功能点列表
     */
    List<Function> findByFids(@Param("fids") List<String> fids);
}
